﻿using Ebt.Mvvm.Behaviors;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.Search;
using Windows.UI.Xaml;
using Windows_8_MVVM.Controls;
using Windows_8_MVVM.ViewModels;
using Windows_8_MVVM.ViewModels.Settings;

// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227

namespace Windows_8_MVVM
{
    /// <summary>
    /// Provides application-specific behavior to supplement the default Application class.
    /// </summary>
    sealed partial class App : Application
    {
        /// <summary>
        /// Initializes the singleton application object.  This is the first line of authored code
        /// executed, and as such is the logical equivalent of main() or WinMain().
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        public RootModel RootModel { get; private set; }

        /// <summary>
        /// Invoked when the application is launched normally by the end user.  Other entry points
        /// will be used when the application is launched to open a specific file, to display
        /// search results, and so forth.
        /// </summary>
        /// <param name="args">Details about the launch request and process.</param>
        protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                //TODO: Load state from previously suspended application
            }

            // Create a Frame to act navigation context and navigate to the first page
            //var rootFrame = new Frame();
            //rootFrame.Navigate(typeof(BlankPage));

            // This control hosts the navigation Frame, login screens and other root stuff.
            var rootElement = new RootControl();
            RootModel = new RootModel();
            rootElement.DataContext = RootModel;

            // TODO Restore the last state and page.

            // Place the frame in the current Window and ensure that it is active
            Window.Current.Content = rootElement;
            Window.Current.Activate();

            OrientationBehavior.Initialize();
            SettingsCharmLauncher.Initialize(() => RootModel);

            SearchPane.GetForCurrentView().QuerySubmitted += OnSearchQuerySubmitted;
            
            RootModel.Navigation.GoToHomePage();
        }

        /// <summary>
        /// Invoked when application execution is being suspended.  Application state is saved
        /// without knowing whether the application will be terminated or resumed with the contents
        /// of memory still intact.
        /// </summary>
        /// <param name="sender">The source of the suspend request.</param>
        /// <param name="e">Details about the suspend request.</param>
        private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: Save application state and stop any background activity
            deferral.Complete();
        }

        void OnSearchQuerySubmitted(SearchPane sender, SearchPaneQuerySubmittedEventArgs args)
        {
            if (string.IsNullOrWhiteSpace(args.QueryText))
                return;

            RootModel.Navigation.GoToSearchPage();
            RootModel.SearchPageModel.ProcessQueryText(args.QueryText);
        }
    }
}
